package LinkedList;

public class SwapTwoNode {
    public static void main(String[] args) {
        ListNode node1=new ListNode(1);
        node1.next=new ListNode(2);
        node1.next.next=new ListNode(3);
        node1.next.next.next=new ListNode(4);
        node1.next.next.next.next=new ListNode(5);
        SwapTwoNode solution=new SwapTwoNode();
        ListNode res=solution.swapTwoNode(node1);
        while(res!=null){
            System.out.println(res.val);
            res=res.next;
        }
    }

    public ListNode swapTwoNode(ListNode head){
        //如果遇到不是成对出现的，也就是单个节点，则直接返回
        if(head==null || head.next==null) return head;
        ListNode one=head;
        ListNode two=one.next;
        //向后递归
        ListNode newNode=swapTwoNode(two.next);
        //现在开始交换
        two.next=one;
        one.next=newNode;
        //返回当前的头节点
        return two;
    }

    public ListNode swapTwoNode2(ListNode head){
        ListNode dummyNode = new ListNode();
        dummyNode.next = head;
        ListNode cur = dummyNode;
        ListNode temp; // 临时节点，保存两个节点后面的节点
        ListNode firstNode; // 临时节点，保存两个节点之中的第一个节点
        ListNode secondNode; // 临时节点，保存两个节点之中的第二个节点
        while(cur.next != null || cur.next.next != null){
            temp = cur.next.next.next;
            firstNode = cur.next;
            secondNode = cur.next.next;
            cur.next = secondNode;
            secondNode.next = firstNode;
            firstNode.next = temp;
            cur = firstNode;
        }
        return dummyNode;
    }
}
